/**
 * 日期格式化函数
 * @param date 日期
 * @param format 日期格式 例如 yyyy-MM-dd HH:mm:ss
 * @example
 * ```
 * dateFormat(new Date('2022-02-02 22:11:12')) // '2022-02-02 22:11:12'
 * dateFormat('2022-02-02 22:11:12') // 2022-02-02 22:11:12
 * dateFormat(1435016807956) // '2015-06-23 07:46:47'
 * dateFormat(1435016807956, 'yy/MM/dd hh:mm:ss') // 15/06/23 07:46:47
 * dateFormat(new Date('2022-02-02 22:11:12'), 'yyyy-MM-dd EEE hh:mm:sss') // 2022-02-02 星期三 10:11:12
 * dateFormat(1435016807956, 'MM.dd yyyy hh:mm:ss') // 06.23 2015 07:46:47
 * ```
 */
export const dateFormat = (date:Date|string|number, format = 'yyyy-MM-dd HH:mm:ss'):string => {
  if(!date) return '';
  if(typeof date === 'string') {
    date = new Date((date+'').replace(/-/g, '/'));
  }
  if(typeof date === 'number') {
    date = new Date(date)
  }
  const o: Record<string, number> = {
    'M+': date.getMonth() + 1,
    'D+': date.getDate(),
    'd+': date.getDate(),
    'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12,
    'H+': date.getHours(),
    'm+': date.getMinutes(),
    's+': date.getSeconds(),
    'q+': Math.floor((date.getMonth() + 3) / 3),
    S: date.getMilliseconds()
  }
  const week: Record<string, string> = {
    0: '\u65e5', // 日
    1: '\u4e00', // 一
    2: '\u4e8c', // 二
    3: '\u4e09', // 三
    4: '\u56db', // 四
    5: '\u4e94', // 五
    6: '\u516d' // 六
  };
  if (/(y+|Y+)/.test(format)) {
    format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
  }
  if (/(E+)/.test(format)) {
    const weekStr = '\u661f\u671f'; // 星期
    const weekStr1 = '\u5468'; // 周
    format = format.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? weekStr : weekStr1) : '') + week[date.getDay() + '']);
  }
  for (const k in o) {
    if (new RegExp('(' + k + ')').test(format)) {
      const str = o[k] + '';
      format = format.replace(RegExp.$1, (RegExp.$1.length === 1) ? (str) : (('00' + str).substr(('' + str).length)));
    }
  }
  return format;
}